package com.jarveis.dbs.core.filter;

import org.apache.log4j.Logger;

import com.jarveis.dbs.Constants;
import com.jarveis.frame.lang.StringUtil;
import com.jarveis.frame.redis.RedisUtil;
import com.jarveis.frame.util.Param;

/**
 * @desc device校验
 * @author liuguojun
 * @create 2017-07-19
 */
public class DeviceFilter implements Filter {

	private Logger logger = Logger.getLogger(DeviceFilter.class);

	public int init() {

		return 0;
	}

	public int filter(Param param) {

		String token = param.getHead().getString(Constants.LABEL_TOKEN);
		String device = param.getHead().getString(Constants.LABEL_DEVICE);
		String tagName = param.getTagName();
		// device键名
		String deviceKey = Constants.REDIS_DEVICE + device;

		// 请求参数校验
		if (Param.REQ.equals(tagName)) {

			// 如果device都不存在说明非法访问
			if (StringUtil.isEmpty(device)) {
				logger.info("device=" + device + ";客户端非法访问。");
				return Constants.ERROR_DEVICE;
			}

			// 如果device存在，token不存在
			boolean exists = RedisUtil.getKeys().exists(deviceKey);
			if (exists) {
				// 如果存在（说明客户端已访问过服务器），验证服务端的token和客户端的token是否一致
				String sToken = RedisUtil.getStrings().get(deviceKey);
				if (!sToken.equals(token)) {
					return Constants.ERROR_TOKEN;
				}
			} else {
				// 客户端第一次访问，或长时间未访问。
				String sToken = StringUtil.getUUID();
				RedisUtil.getStrings().set(deviceKey, sToken); // 绑定客户端与服务端访问标识
				param.getHead().setProperty(Constants.LABEL_TOKEN, sToken); // 将服务端访问标识返回到客户端
			}

			RedisUtil.getKeys().expired(deviceKey, Constants.REDIS_EXPIRED); // 设置客户端面有效期
		}

		return 0;
	}

	public int destory() {

		return 0;
	}
}
